"""
Seaborn 大数据集处理示例

知识点：
1. 使用透明度处理重叠问题
2. 数据抽样技术
3. 使用 hexbin 处理密集数据
4. 使用 KDE 密度图
5. 数据聚合降低复杂度
"""

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# 先设置 seaborn 主题
sns.set_theme(style="whitegrid")

# 然后强制设置中文字体（必须在 set_theme 之后）
plt.rcParams['font.sans-serif'] = ['PingFang HK', 'Hiragino Sans GB', 'STHeiti', 'Arial Unicode MS']
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.family'] = 'sans-serif'

# 创建大数据集
np.random.seed(42)
n = 10000
data = pd.DataFrame({
    'X': np.random.randn(n) * 10 + 50,
    'Y': np.random.randn(n) * 15 + 60,
    '类别': np.random.choice(['A', 'B', 'C'], n),
    '数值': np.random.uniform(10, 100, n)
})
data['Y'] = data['Y'] + data['X'] * 0.5 + np.random.randn(n) * 5

fig, axes = plt.subplots(2, 3, figsize=(18, 12))
fig.suptitle('大数据集处理技术', fontsize=16, fontweight='bold')

# 1. 无处理的散点图
sns.scatterplot(data=data, x='X', y='Y', ax=axes[0, 0])
axes[0, 0].set_title('1. 原始数据（过度绘制）')

# 2. 使用透明度
sns.scatterplot(data=data, x='X', y='Y', alpha=0.1, ax=axes[0, 1])
axes[0, 1].set_title('2. 添加透明度')

# 3. 数据抽样
sample_data = data.sample(n=1000)
sns.scatterplot(data=sample_data, x='X', y='Y', ax=axes[0, 2])
axes[0, 2].set_title('3. 随机抽样（10%）')

# 4. Hexbin 图
axes[1, 0].hexbin(data['X'], data['Y'], gridsize=30, cmap='YlOrRd')
axes[1, 0].set_title('4. Hexbin 密度图')

# 5. 2D KDE 密度图
sns.kdeplot(data=data, x='X', y='Y', fill=True, cmap='viridis', ax=axes[1, 1])
axes[1, 1].set_title('5. KDE 密度图')

# 6. 组合方法
sns.scatterplot(data=sample_data, x='X', y='Y', hue='类别', alpha=0.5, s=30, ax=axes[1, 2])
axes[1, 2].set_title('6. 抽样 + 透明度 + 分类')

plt.tight_layout()
plt.savefig('/Users/binming/Desktop/CodeBase/python/Python语法/1-常用库/1-数据分析/Seaborn关系图示例/6-大数据集处理.png', 
            dpi=300, bbox_inches='tight')
plt.show()

print("大数据集处理技术总结：")
print("1. 透明度：alpha=0.05-0.2")
print("2. 抽样：sample() 方法")
print("3. Hexbin：适合密集数据")
print("4. KDE：展示数据分布")
print("5. 聚合：groupby 降低数据量")
